#include "09_作业02.cpp"
#include <stdexcept>

template<typename T>
class MyQueue {
private:
    MyArray<T> m_container; // 使用MyArray作为底层容器

public:
    // 默认构造函数
    MyQueue() = default;

    // 拷贝构造函数
    MyQueue(const MyQueue& other) = default;

    // 移动构造函数
    MyQueue(MyQueue&& other) noexcept = default;

    // 拷贝赋值运算符
    MyQueue& operator=(const MyQueue& other) = default;

    // 移动赋值运算符
    MyQueue& operator=(MyQueue&& other) noexcept = default;

    // 析构函数
    ~MyQueue() = default;

    // 判断队列是否为空
    bool empty() const {
        return m_container.empty();
    }

    // 返回队列中元素的数量
    size_t size() const {
        return m_container.size();
    }

    // 在队尾添加元素（入队）
    void push(const T& value) {
        m_container.push_back(value);
    }

    // 在队尾添加元素（移动语义）
    void push(T&& value) {
        m_container.push_back(std::move(value));
    }

    // 移除队首元素（出队）
    void pop() {
        if (empty()) {
            throw std::underflow_error("Queue is empty");
        }
        m_container.erase(0);
    }

    // 访问队首元素
    T& front() {
        if (empty()) {
            throw std::underflow_error("Queue is empty");
        }
        return m_container.front();
    }

    const T& front() const {
        if (empty()) {
            throw std::underflow_error("Queue is empty");
        }
        return m_container.front();
    }

    // 访问队尾元素
    T& back() {
        if (empty()) {
            throw std::underflow_error("Queue is empty");
        }
        return m_container.back();
    }

    const T& back() const {
        if (empty()) {
            throw std::underflow_error("Queue is empty");
        }
        return m_container.back();
    }

    // 清空队列
    void clear() {
        m_container.clear();
    }

    // 重载输出运算符
    friend std::ostream& operator<<(std::ostream& os, const MyQueue& queue) {
        os << "Queue: ";
        os << queue.m_container;
        return os;
    }
};
